<!DOCTYPE html>
<html>
    <head>
        <script src="/w3c/resources/testharness.js"></script>
        <script src="/w3c/resources/testharnessreport.js"></script>
        <script src="mediasource-util.js"></script>
        <link rel='stylesheet' href='/w3c/resources/testharness.css'>
    </head>
    <body>
        <div id="log"></div>
        <script>
          test(function ()
          {
              var mediaSource = new MediaSource();
              assert_equals(mediaSource.sourceBuffers.length, 0, 'sourceBuffers is empty');
              assert_equals(mediaSource.activeSourceBuffers.length, 0, 'activeSourceBuffers is empty');
              assert_equals(mediaSource.readyState, 'closed', 'readyState is "closed"');
              assert_true(Number.isNaN(mediaSource.duration), 'duration is NaN');
          }, 'Test attribute values on a closed MediaSource object.');

          test(function ()
          {
              var mediaSource = new MediaSource();
              assert_throws_dom('InvalidStateError',
                  function() { mediaSource.addSourceBuffer(MediaSourceUtil.VIDEO_ONLY_TYPE); },
                  'addSourceBuffer() throws an exception when closed.');
          }, 'Test addSourceBuffer() while closed.');

          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_ONLY_TYPE);

              // Setup a handler to run when the MediaSource closes.
              mediaSource.addEventListener('sourceclose', test.step_func(function (event)
              {
                  assert_equals(mediaSource.sourceBuffers.length, 0, 'sourceBuffers is empty');
                  assert_equals(mediaSource.activeSourceBuffers.length, 0, 'activeSourceBuffers is empty');
                  assert_equals(mediaSource.readyState, 'closed', 'readyState is "closed"');
                  assert_true(Number.isNaN(mediaSource.duration), 'duration is NaN');
                  assert_throws_dom('NotFoundError',
                      function() { mediaSource.removeSourceBuffer(sourceBuffer); },
                      'removeSourceBuffer() throws an exception when closed.');
                  test.done();
              }));

              // Trigger the MediaSource to close.
              mediaElement.src = '';
          }, 'Test removeSourceBuffer() while closed.');

          test(function ()
          {
              var mediaSource = new MediaSource();
              assert_throws_dom('InvalidStateError',
                  function() { mediaSource.endOfStream(); },
                  'endOfStream() throws an exception when closed.');
          }, 'Test endOfStream() while closed.');

          test(function ()
          {
              var mediaSource = new MediaSource();
              assert_throws_dom('InvalidStateError',
                  function() { mediaSource.endOfStream('decode'); },
                  'endOfStream(decode) throws an exception when closed.');
          }, 'Test endOfStream(decode) while closed.');

          test(function ()
          {
              var mediaSource = new MediaSource();
              assert_throws_dom('InvalidStateError',
                  function() { mediaSource.endOfStream('network'); },
                  'endOfStream(network) throws an exception when closed.');
          }, 'Test endOfStream(network) while closed.');


          test(function ()
          {
              var mediaSource = new MediaSource();
              assert_throws_dom('InvalidStateError',
                  function() { mediaSource.duration = 10; },
                  'Setting duration throws an exception when closed.');
          }, 'Test setting duration while closed.');

           mediasource_test(function(test, mediaElement, mediaSource)
          {
              var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_ONLY_TYPE);
              
              assert_equals(mediaSource.readyState, 'open', 'readyState is "open"');
              // Setup a handler to run when the MediaSource closes.
              mediaSource.addEventListener('sourceclose', test.step_func(function (event)
              {
                  assert_equals(mediaSource.readyState, 'closed', 'readyState is "closed"');
                  assert_throws_dom('InvalidStateError', 
                      function() { mediaSource.duration = 10; },
                      'Setting duration when closed throws an exception');
                  test.done();
              }));

              // Trigger the MediaSource to close.
              mediaElement.src = '';
          }, 'Test setting duration while open->closed.');
          
           mediasource_test(function(test, mediaElement, mediaSource)
          {
              var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_ONLY_TYPE);
              
              assert_equals(mediaSource.readyState, 'open', 'readyState is "open"');
              // Setup a handler to run when the MediaSource closes.
              mediaSource.addEventListener('sourceclose', test.step_func(function (event)
              {
                  assert_equals(mediaSource.readyState, 'closed', 'readyState is "closed"');
                  assert_true(Number.isNaN(mediaSource.duration), 'duration is NaN');                  
                  test.done();
              }));

              // Trigger the MediaSource to close.
              mediaElement.src = '';
          }, 'Test getting duration while open->closed.');
          
          mediasource_test(function(test, mediaElement, mediaSource)
          {
              var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_ONLY_TYPE);
              
              assert_equals(mediaSource.readyState, 'open', 'readyState is open');
              
              // Setup a handler to run when the MediaSource closes.
              mediaSource.addEventListener('sourceclose', test.step_func(function (event)
              {
                  assert_equals(mediaSource.readyState, 'closed', 'readyState is closed');
                  assert_throws_dom('InvalidStateError',
                    function() { sourceBuffer.abort(); },
                    'sourceBuffer.abort() throws INVALID_STATE_ERROR');
                  test.done();
              }));

              // Trigger the MediaSource to close.
              mediaElement.src = '';
          }, 'Test sourcebuffer.abort when closed.');
        </script>
    </body>
</html>
